home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / role / AMScen_0_9.lha / AMScen / Extras / wanderers.m < prev   
Text File  |  1995-01-21  |  7KB  |  251 lines

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1995 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * wanderers.m - create some fake players to stress test things.
  9.  */
  10.  
  11. use t_base
  12. use t_util
  13. use t_icons
  14. use t_fight
  15.  
  16. private tp_wanderer CreateTable().
  17. use tp_wanderer
  18.  
  19. define tp_wanderer p_pCarryTarget CreateIntProp().
  20. define tp_wanderer p_pHitHereCount CreateIntProp().
  21. define tp_wanderer p_wLastDir CreateIntProp().
  22.  
  23. define tp_wanderer proc tryMove(int dir)bool:
  24.     thing here, there, me;
  25.  
  26.     here := Here();
  27.     me := Me();
  28.     there := here@(DirProp(dir));
  29.     if there = nil then
  30.     false
  31.     else
  32.     not there@p_rLocked and
  33.         DoPlayerLeaveChecks(me, dir) ~= fail and
  34.         DoDirChecks(here, dir) ~= fail and
  35.         DoRoomAnyLeaveChecks(here) ~= fail
  36.     fi
  37. corp;
  38.  
  39. define tp_wanderer proc attackAgent(thing who)void:
  40.     thing me, oldLoc;
  41.  
  42.     me := Me();
  43.     if (not who@p_pStandard or Random(me@p_pHitHereCount * 2 + 1) = 0) and
  44.     not who@p_pHidden and who@p_pName ~= ""
  45.     then
  46.     oldLoc := Here();
  47.     StandardAttack(me, who, oldLoc);
  48.     me@p_pHitHereCount := me@p_pHitHereCount + 1;
  49.     if Here() ~= oldLoc then
  50.         /* we died, kludge to avoid still attacking */
  51.         me@p_pHitHereCount := 1000000;
  52.     fi;
  53.     fi;
  54. corp;
  55.  
  56. define tp_wanderer proc wandererStep()void:
  57.     thing here, me, object, home;
  58.     list thing lt;
  59.     int dir, firstNum, n, count, pickedUp;
  60.     bool found, lost;
  61.     status st;
  62.  
  63.     me := Me();
  64.     lost := false;
  65.     if Random(4) = 0 and FindName(Here()@p_rContents, p_oName, "grate") ~= fail
  66.     then
  67.     ignore Parse(G, "lift grate");
  68.     else
  69.     firstNum := me@p_wLastDir;
  70.     if Random(3) ~= 0 then
  71.         dir := firstNum;
  72.     else
  73.         firstNum := DirBack(firstNum);
  74.         while
  75.         dir := Random(12);
  76.         dir = firstNum
  77.         do
  78.         od;
  79.         firstNum := dir;
  80.     fi;
  81.     found := false;
  82.     while not found do
  83.         if tryMove(dir) then
  84.         found := true;
  85.         else
  86.         dir := (dir + 1) % 12;
  87.         if dir = firstNum then
  88.             lost := true;
  89.             found := true;
  90.         fi;
  91.         fi;
  92.     od;
  93.     fi;
  94.     if not lost then
  95.     /* cannot get upset if 'lost', since that can happen if all directions
  96.        we try in the proving grounds are blocked by monsters. */
  97.     me@p_wLastDir := dir;
  98.     MachineMove(dir);
  99.     me@p_pHitHereCount := 0;
  100.     ForEachAgent(Here(), attackAgent);
  101.     /* grab this after the attacks - we may have died! */
  102.     here := Here();
  103.     lt := here@p_rContents;
  104.     count := Count(lt);
  105.     pickedUp := 0;
  106.     n := 0;
  107.     while n < count do
  108.         object := lt[n];
  109.         n := n + 1;
  110.         if not object@p_oInvisible then
  111.         if Random(pickedUp + 1) = 0 then
  112.             st := DoGet(here, me, object);
  113.             if st = continue then
  114.             count := count - 1;
  115.             n := n - 1;
  116.             pickedUp := pickedUp + 1;
  117.             elif st = succeed then
  118.             /* do not really know the state of things - skip one */
  119.             count := count - 1;
  120.             fi;
  121.         fi;
  122.         fi;
  123.     od;
  124.     lt := me@p_pCarrying;
  125.     count := Count(lt);
  126.     if count ~= 0 then
  127.         if count <= me@p_pCarryTarget then
  128.         count := 0;
  129.         else
  130.         count := Random(count - me@p_pCarryTarget);
  131.         fi;
  132.     fi;
  133.     while count ~= 0 do
  134.         object := lt[0];
  135.         count := count - 1;
  136.         if DoDrop(here, me, object) ~= continue then
  137.         count := 0;
  138.         fi;
  139.     od;
  140.     fi;
  141.     After(3 + Random(6), wandererStep);
  142. corp;
  143.  
  144. define tp_wanderer proc createMarble(thing who; string colour)void:
  145.     thing it;
  146.  
  147.     it := CreateThing(nil);
  148.     it@p_oName := "marble;" + colour;
  149.     it@p_oHome := Here();
  150.     it@p_oCarryer := who;
  151.     it@p_oCreator := Me();    /* whoever creates the wanderers */
  152.     SetThingStatus(it, ts_readonly);
  153.     AddTail(who@p_pCarrying, it);
  154. corp;
  155.  
  156. define tp_wanderer proc wandererStart()void:
  157.  
  158.     OPrint(Me()@p_pName + " has appeared.\n");
  159.     ForEachAgent(Here(), ShowIconOnce);
  160.     After(3 + Random(6), wandererStep);
  161. corp;
  162.  
  163. define tp_wanderer proc wandererPre()status:
  164.  
  165.     SPrint(TrueMe(), Me()@p_pName + " accepts the gift.\n");
  166.     continue
  167. corp;
  168.  
  169. define tp_wanderer proc wandererNoNo()status:
  170.  
  171.     DoSay("Watch it!");
  172.     fail
  173. corp;
  174.  
  175. define tp_wanderer genericWanderer CreateThing(nil).
  176. genericWanderer@p_pStandard := true.
  177. genericWanderer@p_pProtection := 5.     /* armour class +5 */
  178. genericWanderer@p_pHitMax := 50.
  179. genericWanderer@p_pStrength := 7.
  180. genericWanderer@p_pGivePre := wandererPre.
  181. genericWanderer@p_oTouchChecker := wandererNoNo.
  182. genericWanderer@p_oSmellChecker := wandererNoNo.
  183. genericWanderer@p_oPushChecker := wandererNoNo.
  184. genericWanderer@p_oPullChecker := wandererNoNo.
  185. genericWanderer@p_oTurnChecker := wandererNoNo.
  186. genericWanderer@p_oLiftChecker := wandererNoNo.
  187. genericWanderer@p_oLowerChecker := wandererNoNo.
  188. genericWanderer@p_oEatChecker := wandererNoNo.
  189. GNewIcon(genericWanderer, makeWandererIcon()).
  190.  
  191. define tp_wanderer proc makeWanderer(string name; int carryTarget;
  192.     thing where)void:
  193.     thing me, marble;
  194.     int i;
  195.  
  196.     me := CreateThing(genericWanderer);
  197.     me@p_wLastDir := Random(12);
  198.     me@p_pDesc := name + ", created " + where@p_rName +
  199.     ", is wandering around and stress-testing the MUD system.";
  200.     SetupMachine(me);
  201.     if carryTarget % 2 = 0 then
  202.     me@p_oLight := true;
  203.     fi;
  204.     me@p_pCarryTarget := carryTarget;
  205.     createMarble(me, "red");
  206.     createMarble(me, "blue");
  207.     createMarble(me, "green");
  208.     createMarble(me, "white");
  209.     createMarble(me, "black");
  210.     InitFighter(me);
  211.     /* override 'InitFighter' by inheriting from 'genericWanderer' */
  212.     me -- p_pProtection;
  213.     me -- p_pHitMax;
  214.     me@p_pHitNow := 50;
  215.     me -- p_pStrength;
  216.     CreateMachine(name, me, where, wandererStart);
  217.     ignore SetMachineActive(me, wandererStep);
  218. corp;
  219.  
  220. define tp_wanderer proc createWanderers()void:
  221.     thing here;
  222.  
  223.     here := Here();
  224.     makeWanderer("Arnold",    1, here);
  225.     makeWanderer("Betty",     2, here);
  226.     makeWanderer("Charles",   3, here);
  227.     makeWanderer("Diana",     4, here);
  228.     makeWanderer("Eugene",    5, here);
  229.     makeWanderer("Farrah",    6, here);
  230.     makeWanderer("Gregory",   7, here);
  231.     makeWanderer("Hannah",    1, here);
  232.     makeWanderer("Irving",    2, here);
  233.     makeWanderer("Joan",      3, here);
  234.     makeWanderer("Keith",     4, here);
  235.     makeWanderer("Lucille",   5, here);
  236.     makeWanderer("Martin",    6, here);
  237.     makeWanderer("Nancy",     7, here);
  238.     makeWanderer("Orville",   1, here);
  239.     makeWanderer("Penelope",  2, here);
  240.     makeWanderer("Quint",     3, here);
  241.     makeWanderer("Rhonda",    4, here);
  242.     makeWanderer("Samuel",    5, here);
  243.     makeWanderer("Teresa",    6, here);
  244.     makeWanderer("Ulysses",   7, here);
  245.     makeWanderer("Veronica",  1, here);
  246.     makeWanderer("William",   2, here);
  247.     makeWanderer("Xaviera",   3, here);
  248.     makeWanderer("Yves",      4, here);
  249.     makeWanderer("Zenda",     5, here);
  250. corp;
  251.